package com.heima.leetcode.practice;

/**
 * @author 勾新杰
 * @version 1.0
 * @description: leetcode 64 最小路径和
 * @date 2024/12/20 21:20
 */
public class E64 {

    /**
     * <h3>方法一：动态规划，二维</h3>
     *
     * @param grid 目标数组
     * @return 最小路径和
     */
    public int minPathSum1(int[][] grid) {
        int n = grid.length, m = grid[0].length;
        int[][] dp = new int[n][m];
        dp[0][0] = grid[0][0];
        for (int j = 1; j < m; j++)
            dp[0][j] = dp[0][j - 1] + grid[0][j];
        for (int i = 1; i < n; i++)
            dp[i][0] = dp[i - 1][0] + grid[i][0];
        for (int i = 1; i < n; i++)
            for (int j = 1; j < m; j++)
                dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];
        return dp[n - 1][m - 1];
    }

    /**
     * <h3>方法二：动态规划，一维</h3>
     *
     * @param grid 目标数组
     * @return 最小路径和
     */
    public int minPathSum2(int[][] grid) {
        int n = grid.length, m = grid[0].length;
        int[] dp = new int[m];
        dp[0] = grid[0][0];
        for (int j = 1; j < m; j++)
            dp[j] = dp[j - 1] + grid[0][j];
        for (int i = 1; i < n; i++) {
            dp[0] += grid[i][0]; // 易错点，不要忘记更新第0列
            for (int j = 1; j < m; j++)
                dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j];
        }
        return dp[m - 1];
    }
}
